/**
 * Copyright &copy; 2013-2015 山东易科德软件有限公司 All rights reserved.
 */
package cn.net.ecode.modules.sys.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.net.ecode.common.config.Global;
import cn.net.ecode.common.persistence.Page;
import cn.net.ecode.common.service.CrudService;
import cn.net.ecode.modules.sys.dao.RoleDao;
import cn.net.ecode.modules.sys.entity.Role;
import cn.net.ecode.modules.sys.entity.User;
import cn.net.ecode.modules.sys.utils.DataScopeUtils;
import cn.net.ecode.modules.sys.utils.UserUtils;

/**
 * 角色管理
 * @author ThinkGem
 * @version 2015-11-5
 */
@Service
@Transactional(readOnly = true)
public class RoleService extends CrudService<RoleDao, Role> {
	
	@Autowired
	private UserService userService;
	
	/**
	 * 获取角色
	 * @param id
	 * @return
	 */
	public Role get(String roleCode) {
		return super.get(roleCode);
	}
	
	/**
	 * 根据角色名获取角色
	 * @param name
	 * @return
	 */
	public Role getByName(String name) {
		Role r = new Role();
		r.setRoleName(name);
		return dao.getByName(r);
	}

	/**
	 * 根据英文角色名获取角色
	 * @param enname
	 * @return
	 */
	public Role getByEnname(String enname) {
		Role r = new Role();
		r.setNameEn(enname);
		return dao.getByEnname(r);
	}
	
	/**
	 * 查询角色列表
	 * @param role
	 * @return
	 */
	public List<Role> findList(Role role) {
		// 生成数据权限过滤条件
		DataScopeUtils.genSql(role, "dsf", "role_m", "a");
		return super.findList(role);
	}
	
	/**
	 * 查询角色列表
	 * @param page
	 * @param role
	 * @return
	 */
	public Page<Role> findPage(Page<Role> page, Role role) {
		// 生成数据权限过滤条件
		DataScopeUtils.genSql(role, "dsf", "role_m", "a");
		// 设置分页参数
		role.setPage(page);
		// 执行分页查询
		page.setList(dao.findList(role));
		return page;
	}

	/**
	 * 保存角色
	 * @param role
	 */
	@Transactional(readOnly = false)
	public void save(Role role, String type) {
		if("1".equals(type)||"0".equals(type)){
			// 基本信息
			if (role.getIsNewRecord()) {
				role.preInsert();
				dao.insert(role);
			} else {
				role.preUpdate();
				dao.update(role);
			}
		}
		if("2".equals(type)||"0".equals(type)){
			// 更新角色与菜单关联
			dao.deleteRoleMenu(role);
			if (role.getMenuList().size() > 0) {
				dao.insertRoleMenu(role);
			}
		}
//		// 更新角色与部门关联
//		roleDao.deleteRoleOffice(role);
//		if (role.getOfficeList().size() > 0) {
//			roleDao.insertRoleOffice(role);
//		}
		// 清除该角色下所有的用户缓存
		User u = new User(new Role(role.getRoleCode()));
		List<User> userList = userService.findUserByRoleCode(u);
		for (User user : userList) {
			UserUtils.clearCache(user);
		}
	}
	
	/**
	 * 更新显示角色
	 * @param role
	 * @return
	 */
	@Transactional(readOnly = false)
	public void show(Role role){
		role.setIsShow(Global.SHOW);
		dao.updateIsShow(role);
	}
	
	/**
	 * 更新隐藏角色
	 * @param role
	 * @return
	 */
	@Transactional(readOnly = false)
	public void hide(Role role){
		role.setIsShow(Global.HIDE);
		dao.updateIsShow(role);
	}

	/**
	 * 删除角色
	 * @param role
	 */
	@Transactional(readOnly = false)
	public void delete(Role role) {
		role.preUpdate();
		dao.delete(role);
		dao.deleteRoleUser(role);
		// 清除该角色下所有的用户缓存
		User u = new User(new Role(role.getRoleCode()));
		List<User> userList = userService.findUserByRoleCode(u);
		for (User user : userList) {
			UserUtils.clearCache(user);
		}
	}

	/**
	 * 该用户是否有该角色
	 * @return
	 */
	public boolean hasUserRole(Role role){
		String userId = dao.hasUserRole(role);
		return userId !=null && userId.trim().length() > 0;
	}
	
}
